// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "skia/ext/opacity_filter_canvas.h"
#include "third_party/skia/include/core/SkPaint.h"
#include "third_party/skia/include/core/SkTLazy.h"

namespace skia {

OpacityFilterCanvas::OpacityFilterCanvas(SkCanvas* canvas,
    float opacity,
    bool disable_image_filtering)
    : INHERITED(canvas)
    , alpha_(SkScalarRoundToInt(opacity * 255))
    , disable_image_filtering_(disable_image_filtering)
{
}

bool OpacityFilterCanvas::onFilter(SkTCopyOnFirstWrite<SkPaint>* paint, Type) const
{
    // TODO(fmalita): with the new onFilter() API we could override alpha even
    // when the original paint is null; is this something we should do?
    if (*paint) {
        if (alpha_ < 255)
            paint->writable()->setAlpha(alpha_);

        if (disable_image_filtering_)
            paint->writable()->setFilterQuality(kNone_SkFilterQuality);
    }

    return true;
}

void OpacityFilterCanvas::onDrawPicture(const SkPicture* picture,
    const SkMatrix* matrix,
    const SkPaint* paint)
{
    SkTCopyOnFirstWrite<SkPaint> filteredPaint(paint);
    if (this->onFilter(&filteredPaint, kPicture_Type)) {
        // Unfurl pictures in order to filter nested paints.
        this->SkCanvas::onDrawPicture(picture, matrix, filteredPaint);
    }
}

} // namespace skia
